/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.datamodel.LazyCategoria;
import br.jm.financeiro.entity.Categoria;
import br.jm.financeiro.sistema.eao.CategoriaEao;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class CategoriaBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Categoria selectedCategoria;
    private LazyDataModel<Categoria> lazyModel;
    private CategoriaEao categoriaJpa;
    private SelectItem[] tipCategoriaOptions;
    private String[][] tipCategorias = {{"1", "2", "3"}, {"Cliente-Fornecedor", "Serviço", "Produto"}};
    private Map<String, String> categorias = new HashMap<String, String>();
    private String dscTipCategoria;
    private String cPagina;
    private String nTipo = "0";
    private String cFiltro;

    public CategoriaBean() {
        categoriaJpa = CategoriaEao.getInstance();
        selectedCategoria = new Categoria();

        tipCategoriaOptions = createFilterOptions(tipCategorias);

        categorias.put("Cliente-Fornecedor", "1");
        categorias.put("Serviço", "2");
        categorias.put("Produto", "3");

        FacesContext context = FacesContext.getCurrentInstance();
        cPagina = context.getViewRoot().getViewId();

        if (cPagina.matches(".*fornecedor.*") || cPagina.matches(".*cliente.*")) {
            nTipo = "1";
        } else if (cPagina.matches(".*conta_receber_detalhe.*")) {
            nTipo = "2";
        } else if (cPagina.matches(".*produto.*")) {
            nTipo = "3";
        }
        if (!nTipo.equals("0")) {
            cFiltro = " tip_categoria = ".concat(nTipo);
        }

        lazyModel = new LazyCategoria(categoriaJpa, cFiltro);
    }

    public void inserir(ActionEvent actionEvent) {
        FacesMessage msg = null;


        try {
            selectedCategoria.setIdCategoria(null);
            categoriaJpa.create(selectedCategoria);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Categoria Inserida com Sucesso: ".concat(selectedCategoria.getDscCategoria())), selectedCategoria.getDscCategoria());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir" + selectedCategoria.getDscCategoria(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        FacesContext ctx = FacesContext.getCurrentInstance();
        FacesMessage msg = null;

        try {
            categoriaJpa.edit(selectedCategoria);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Categoria Alterada com Sucesso: ".concat(selectedCategoria.getDscCategoria())),selectedCategoria.getDscCategoria());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: " + selectedCategoria.getDscCategoria(),e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            if (selectedCategoria.getIdCategoria() == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Categoria não pode ser Excluida - Controle Interno do Sistema!", selectedCategoria.getDscCategoria());
            } else {
                categoriaJpa.destroy(selectedCategoria);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Categoria Excluida com Sucesso: ".concat(selectedCategoria.getDscCategoria())), selectedCategoria.getDscCategoria());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: " + selectedCategoria.getDscCategoria(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public LazyDataModel<Categoria> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Categoria> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Categoria getSelectedCategoria() {
        if (selectedCategoria == null) {
            selectedCategoria = new Categoria();
        }
        return selectedCategoria;
    }

    public void setSelectedCategoria(Categoria selectedCategoria) {
        this.selectedCategoria = selectedCategoria;
    }

    private SelectItem[] createFilterOptions(String[][] tipCategorias) {
        SelectItem[] options = new SelectItem[4];

        options[0] = new SelectItem("", "Selecione");
        for (int i = 0; i < 3; i++) {
            options[i + 1] = new SelectItem(tipCategorias[0][i], tipCategorias[1][i]);
        }

        return options;
    }

    public void setTipCategoriaOptions(SelectItem[] tipCategoriaOptions) {
        this.tipCategoriaOptions = tipCategoriaOptions;
    }

    public SelectItem[] getTipCategoriaOptions() {
        return tipCategoriaOptions;
    }

    public Map<String, String> getCategorias() {
        return categorias;
    }

    public void setCategorias(Map<String, String> categorias) {
        this.categorias = categorias;
    }

    public String getDscTipCategoria() {
        return dscTipCategoria;
    }

    public void setDscTipCategoria(String dscTipCategoria) {
        this.dscTipCategoria = dscTipCategoria;
    }

    public void onRowSelect(SelectEvent event) {
        this.selectedCategoria = (Categoria) event.getObject();
    }

    public void preparaInserir(ActionEvent event) {
        this.selectedCategoria = new Categoria();
    }
}
